Dataformの内蔵GitリポジトリからAPIでcommit履歴を取得してみた

Dataformの内蔵GitリポジトリからAPIでcommit履歴を取得してみた

Dataformの内蔵Gitリポジトリを使用し、APIを通じてコミット履歴や内容を取得する方法を試してみました。fetchHistory APIでcommitSHAを取得し、readFile APIでその内容をBase64デコードして確認する手順も紹介しています。
Clock Icon2024.08.12

概要

DataformのGitは、

  1. GitHub・GitLabなどのサードパーティのGitリポジトリを使用する
  2. Dataform内蔵Gitリポジトリを使用する

という2通りのリポジトリ運用が可能です。今回は(2)のDataform内蔵Gitリポジトリを使用した場合を前提に記事を書いています。
※本記事では読みさすさを考慮して勝手に内蔵Gitリポジトリと呼称しています
内蔵Gitリポジトリの作成方法は以下です。
https://cloud.google.com/dataform/docs/create-repository?hl=ja

多くの場合(1)のサードパーティのGitリポジトリを使用する運用をとり、GitHubなどと接続することが多いのではないかと思いますがワークロードによってはサードパーティのGitを使用することができず、内蔵Gitリポジトリを使用せざるおえないケースもあるかもしれません。
しかしながら、DataformのGUIでは利用できるGitの機能が限られています(だいたいpull、push、commit、revert程度です)。
私がDataformのGUIで内蔵Gitを使用していてどうしてもcommit履歴が見たくなったのが本記事の発端です。もし同様に内蔵Gitリポジトリを使用していて、commit履歴を見てみたいという方がいたらぜひ読んでみてください。

この記事に書いてあること

  • 内蔵GitリポジトリからAPIでcommit履歴を取得する方法
  • 内蔵GitリポジトリからcommitSHAを元にcommit内容を取得すること

内蔵GitリポジトリからAPIでcommit履歴を取得する方法

概要

Dataform APIを使用します。
https://cloud.google.com/dataform/reference/rest

数あるDataform APIのなかでどのAPIかというと、以下のfetchHistoryAPIとなります。

https://cloud.google.com/dataform/reference/rest/v1beta1/projects.locations.repositories/fetchHistory

https://dataform.googleapis.com/v1beta1/projects/"プロジェクトID"/locations/"リージョン"/repositories/"リポジトリ名":fetchHistory

本APIはパラメータに以下を指定することもできます(必須ではないです)。

Parameter 内容
pageSize 返すコミットの最大数。未指定の場合、サーバは適切なデフォルト値で返却する
pageToken ページ分割された場合のページネーション用トークン。コミット数が多い場合必要になる

今回はとくにpageSizeやpageTokenは設定せずに叩きます。

叩いてみる

curlコマンドを用いて叩きます。

 curl https://dataform.googleapis.com/v1beta1/projects/プロジェクトID/locations/asia-northeast1/repositories/リポジトリ名:fetchHistory --header "Authorization: Bearer $(gcloud auth print-access-token)"

APIのエンドポイント以外に、gcloudコマンドで設定しているGoogle Cloudアカウントの認証情報から生成したアクセストークンを用いて認証しています。

"Authorization: Bearer $(gcloud auth print-access-token)"

上記コマンドを叩くと、内蔵Gitリポジトリのcommit履歴が返却されます。以下は出力例です。

% curl 'https://dataform.googleapis.com/v1beta1/projects/プロジェクトID/locations/asia-northeast1/repositories/リポジトリ名:fetchHistory' --header "Authorization: Bearer $(gcloud auth print-access-token)" 
{
  "commits": [
    {
      "commitTime": "2024-06-11T10:47:08Z",
      "commitSha": "6a286e76c66588abeee0d798205c65933557656b",
      "author": {
        "name": "根本 夏瑠",
        "emailAddress": "mail-address"
      },
      "commitMessage": "test commit"
    },
    {
      "commitTime": "2024-06-11T10:45:09Z",
      "commitSha": "ef5f96452e5a86a5d1b6d634d88197bd8b234882",
      "author": {
        "name": "根本 夏瑠",
        "emailAddress": "mail-address"
      },
      "commitMessage": "first commit"
    },

上記からcommitShaを取得することができるので、commitSHAを元にcommit内容を取得することが別のAPIを用いると可能です(後述です)

内蔵GitリポジトリからcommitSHAを元にcommit内容を取得する

概要

fetchHistoryAPIを用いることでcommitSHAを取得することができました。それではcommitSHAをもとにどんなcommitがあったのかを取得してみます。
使用するAPIとしてはreadFileAPIとなります。このAPI、エンドポイントが2つありましてリポジトリワークスペースの2種類が提供されています。
ただし若干叩き方が異なっております。

種類 叩き方 エンドポイント
リポジトリ ファイルパス、commitSHAを指定 https://dataform.googleapis.com/v1beta1/{name=projects//locations//repositories/*}:readFile
ワークスペース ファイルパス、リビジョンを指定 https://dataform.googleapis.com/v1beta1/{workspace=projects//locations//repositories//workspaces/}:readFile

https://cloud.google.com/dataform/reference/rest/v1beta1/projects.locations.repositories/readFile

https://cloud.google.com/dataform/reference/rest/v1beta1/projects.locations.repositories.workspaces/readFile

今回はcommitSHAを元に取得したいので、リポジトリの方のreadFileAPIを叩きます。(リポジトリにpushされていない場合のファイル内容確認の時にワークスペース単位の方のAPIを叩くものと考えます)

実際に叩いてみる

curlコマンドを用いて叩きます。

curl "https://dataform.googleapis.com/v1beta1/projects/プロジェクトID/locations/asia-northeast1/repositories/リポジトリ名:readFile?commitSha=commitSHA&path=ファイルパス" \
--header "Authorization: Bearer $(gcloud auth print-access-token)" | jq -r '.contents' | base64 --decode

本APIはGETでのリクエストとなるためクエリストリングにcommitShapathを指定しています。
commitShaに関しては、fetchHistoryでわかった値を、pathに関してはワークスペース内の該当ファイルのファイルパスを指定します。(fetchHistoryからはどのファイルをコミットしたかはわからないのでご注意ください)commitShaを指定しなかった場合はHEADの内容が返却されます。
出力例としては以下となります。コミットしたファイル内容がそのまま返却されます。

config {
  type: "operations"
}
-- INSERT文を記述
INSERT INTO `test_dataform.test_table` (test_test)
VALUES
  (${dataform.projectConfig.vars.compile_val});

基本はfetchHistoryAPIを叩いた時と同様ですが、今回はjqでレスポンスをパースしてbase64でデコードしています。
というのも、readFileAPIのファイル内容のレスポンスはbase64でエンコードされているためデコードが必要となっています。
base64のデコードをしない場合は以下のようなレスポンスとなります。

{
  "contents": "Y29uZmlnIHsNCiAgdHlwZTogIm9wZXJhdGlvbnMiDQp9DQotLSBJTlNFUlTmlofjgpLoqJjov7ANCklOU0VSVCBJTlRPIGB0ZXN0X2RhdGFmb3JtLnRlc3RfdGFibGVgICh0ZXN0X3Rlc3QpDQpWQUxVRVMNCiAgKCR7ZGF0YWZvcm0ucHJvamVjdENvbmZpZy52YXJzLmNvbXBpbGVfdmFsfSk7"
}

どうでしょうか。特に難しいところもなくcommitShaを元にデータを取得できたかと思います。このあとは、ローカルでdiffを取るなりなんなり好きなように扱えば良いかなと思います。

まとめ

まずは3行まとめです。

  • 内蔵GitリポジトリからAPIでコミット履歴、コミット内容を取得できる
  • readFile APIにはリポジトリ・ワークスペース単位のAPIが存在する
  • readFile APIのファイル内容のレスポンスはbase64でエンコードされている

内蔵GitのGUIでの機能が強化されたら、本記事はお蔵入りかなと思います。(また、そもそもGitHubなどを用いていれば・・・)
とはいえ、内蔵Gitをどうしても使わなければいけない、Dataform APIが大好きな人にはもしかしたら本記事は響くかもしれません。
実際私は、どうしても内蔵Gitリポジトリで過去のコミットを見たかったので色々やってみて本記事の内容で解決しました。もっとスマートな方法もあるかもなので今後も探究していきます。
この記事が、どなたかの心に響いていたら嬉しいです。それではまた。ナマステー

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.